import java.util.Stack;

/**
 * Created With IntelliJ IDEA
 * Description:leetcode：232. 用栈实现队列
 * <a href="https://leetcode.cn/problems/implement-queue-using-stacks/">...</a>
 * User: DELL
 * Data: 2023-01-08
 * Time: 22:50
 */

//题目规定：假设所有操作都是有效的 （例如，一个空的队列不会调用 pop 或者 peek 操作）
//因此解题过程中没有进行合法性检验，若题目中没有规定，则需要检验并抛出异常

//解题思路：利用两个栈来模拟队列，首先每次push的时候，均入stack1，而每次pop和peek的
//        时候，因为栈和队列中的方向不同，因此我们将stack1中的所有元素均取出压入stack2
//        中，每次pop和peek的时候均对stack2中的元素操作即可，这里就是利用了将栈中元素取出，再压入
//        另一个栈中可以改变元素顺序的方法，因此每次pop和peek前检查stack2是否为空即可。
class MyQueue {
    //两个辅助栈
    private final Stack<Integer> stack1;
    private final Stack<Integer> stack2;

    public MyQueue() {
        this.stack1 = new Stack<>();
        this.stack2 = new Stack<>();
    }

    public void push(int x) {
        stack1.push(x);
    }

    public int pop() {
        if (stack2.size() == 0) {
            adjust();
        }
        return stack2.pop();
    }

    //将stack1中的所有元素取出均依次存入stack2中
    private void adjust() {
        while (!stack1.isEmpty()) {
            stack2.push(stack1.pop());
        }
    }
    public int peek() {
        if (stack2.size() == 0) {
            adjust();
        }
        return stack2.peek();
    }

    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}
